SQL
NOTE
SQL 기초 문법 정리. 필드 조회(SELECT), 조건식(WHERE), 정렬(ORDER BY), JOIN, 집합 연산(UNION), 서브쿼리, CRUD 구문.
NOTE
원문의 스마트 따옴표·연산자 오타(
≤,NOT IS NULL,MINUSM INSESET등)를 표준 SQL로 교정함(사실 확인 권장).
💻 예시
필드 조회 (SELECT)
-- 단일/여러 필드 조회
SELECT 필드이름 FROM 테이블;
SELECT 필드이름1, 필드이름2 FROM 테이블;
-- 모든 필드 조회
SELECT * FROM 테이블;
-- 중복 제거 조회
SELECT DISTINCT 필드이름 FROM 테이블;
-- 조건식 적용
SELECT * FROM 테이블 WHERE 필드이름 = 0;
-- 여러 조건식
SELECT *
FROM 테이블
WHERE 필드이름1 = 0
AND 필드이름2 = 0
OR 필드이름3 = 0;조건식의 종류
IN/BETWEEN/LIKE는 각각 OR나 >= <= 조합, 부분 문자열 비교를 더 짧고 읽기 쉽게 표현하기 위한 것이다. 특히 IS NULL/IS NOT NULL이 따로 있는 이유는 SQL에서 NULL은 “값이 없음”을 뜻해 =로 비교할 수 없기 때문이다(필드 = NULL은 항상 결과가 없음으로 평가된다).
WHERE 필드이름 BETWEEN 0 AND 100;
WHERE 필드이름 NOT BETWEEN 0 AND 100;
WHERE 필드이름 IN (0, 10, 100);
WHERE 필드이름 NOT IN (0, 10, 100);
WHERE 필드이름 IS NULL;
WHERE 필드이름 IS NOT NULL;
WHERE 필드이름 LIKE '홍__'; -- '_' : 한 글자 매칭
WHERE 필드이름 NOT LIKE '홍__';
WHERE 필드이름 LIKE '홍%'; -- '%' : 0글자 이상 매칭
WHERE 필드이름 NOT LIKE '홍%';정렬 (ORDER BY)
DB는 저장된 순서를 보장하지 않으므로, 화면에 특정 순서(최신순, 이름순 등)로 보여줘야 한다면 반드시 ORDER BY를 명시해야 한다.
-- 특정 필드 기준 정렬
SELECT 필드이름 FROM 테이블 ORDER BY 필드이름;
-- 정렬 기준이 여러 개
SELECT 필드이름
FROM 테이블
ORDER BY 필드이름1, 필드이름2 DESC, 필드이름3 ASC;JOIN
여러 테이블에 나뉘어 저장된 데이터를 한 번의 조회로 합쳐 보기 위해 쓴다. 내부 조인은 양쪽에 모두 값이 있는 행만 반환하고, 외부 조인은 한쪽 테이블에 대응 값이 없어도(NULL로 채워서) 결과에 포함시킨다 — 예를 들어 “주문이 없는 회원도 함께 보고 싶다”면 외부 조인이 필요하다.
-- 내부 조인
SELECT 테이블1.필드이름
FROM 테이블1, 테이블2
WHERE 테이블1.필드이름 = 테이블2.필드이름;
-- 별칭으로 간소화
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름;
-- 외부 조인 (Oracle (+) 문법)
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름(+);NOTE
위 예시는 원문 그대로 암시적 조인(
FROM A, B) 형태다. 실무에서는JOIN ... ON명시적 조인 사용을 권장한다.
집합 연산 (UNION)
두 쿼리 결과를 위아래로 합칠 때 쓴다. UNION은 중복을 제거하고 UNION ALL은 제거하지 않는데, 중복 제거는 내부적으로 정렬/비교 비용이 들기 때문에 중복이 없다는 걸 알고 있거나 굳이 제거할 필요가 없다면 UNION ALL이 더 빠르다.
SELECT 필드이름 FROM 테이블1
UNION -- 또는 UNION ALL, MINUS, INTERSECT
SELECT 필드이름 FROM 테이블2;서브쿼리
조회 조건 자체가 다른 조회 결과에 의존할 때(예: “평균보다 높은 값만 조회”) JOIN으로 표현하기 어렵거나 가독성이 떨어지는 경우에 쓴다. 서브쿼리 결과가 여러 행일 수 있으면 = 대신 IN/ANY/ALL/EXISTS를 써야 한다 — =는 값이 정확히 하나일 때만 쓸 수 있기 때문이다.
-- 서브쿼리 결과가 하나
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름 <= (
SELECT 필드이름2
FROM 테이블
WHERE 조건문
);
-- 서브쿼리(중첩) 결과가 여러 개 (IN 외에 ANY, ALL, EXISTS 사용 가능)
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름2 IN (
SELECT 필드이름2
FROM 테이블
WHERE 조건문
);CRUD
UPDATE/DELETE는 WHERE 절을 빠뜨리면 테이블 전체가 대상이 되어버리므로(전체 행 수정/삭제), 조건절을 반드시 먼저 확인하는 습관이 중요하다.
-- CREATE
INSERT INTO 테이블 (필드이름1, 필드이름2)
VALUES (값1, 값2);
-- UPDATE
UPDATE 테이블
SET 필드이름1 = 값1, 필드이름2 = 값2
WHERE 조건문;
-- DELETE
DELETE FROM 테이블
WHERE 조건문;